/*******************************************************************************
 * Copyright (c) 2011, 2016 Eurotech and/or its affiliates
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Eurotech
 *******************************************************************************/
package org.eclipse.kura.web.shared.service;

import java.util.List;

import org.eclipse.kura.web.shared.GwtKuraException;
import org.eclipse.kura.web.shared.model.GwtConfigComponent;
import org.eclipse.kura.web.shared.model.GwtXSRFToken;

import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;

/**
 * Set of methods that can be used to get or update component configurations. Those methods will work in relation with a
 * {@link org.eclipse.kura.configuration.ConfigurationService} implementation running in the framework.
 *
 */
@RemoteServiceRelativePath("component")
public interface GwtComponentService extends RemoteService {

    /**
     * Returns a the list of component configurations. This list is filtered from a set of services that need to be
     * hidden and not displayed in the "Services" section of the local web ui.
     * 
     * @param xsrfToken
     *            the cross site request forgery token.
     * @return a list of GwtConfigComponent that represent the GWT Component Configuration that will be rendered in the
     *         client part of the web ui.
     * @throws GwtKuraException
     *             if the XSRF verification fails.
     * @throws GwtKuraException
     *             if the Configuration Service cannot be located.
     * @throws GwtKuraException
     *             if the list of services that need to be hidden from rendering cannot be filled.
     * @throws GwtKuraException
     *             if the list of components registered in the framework cannot be extracted.
     */
    public List<GwtConfigComponent> findServicesConfigurations(GwtXSRFToken xsrfToken) throws GwtKuraException;

    /**
     * Returns a filtered list of component configurations. This list is named filtered because the configurations of
     * the components tracked are not complete but mapped to the respective component metatype. This means that eventual
     * additional properties of the component that are tracked by the ConfigurationAdmin will not be reflected in the
     * resulting GwtConfigComponent returned.
     * 
     * @param xsrfToken
     *            the cross site request forgery token.
     * @return a list of GwtConfigComponent.
     * @throws GwtKuraException
     *             if the XSRF verification fails.
     * @throws GwtKuraException
     *             if the Configuration Service cannot be located.
     * @throws GwtKuraException
     *             if the component configurations cannot be extracted.
     */
    public List<GwtConfigComponent> findFilteredComponentConfigurations(GwtXSRFToken xsrfToken) throws GwtKuraException;

    /**
     * Returns a list containing the component configuration of the requested component specified by the provided PID.
     * As for {@link #findFilteredComponentConfigurations(GwtXSRFToken)}, the returned configuration is filtered because
     * contains only the properties that can be mapped to the component metatype.
     * 
     * @param xsrfToken
     *            the cross site request forgery token.
     * @param pid
     *            the Kura persistent identifier, <i>kura.service.pid</i>, of the component whose configuration needs to
     *            be returned as result.
     * @return a list of GwtConfigComponent.
     * @throws GwtKuraException
     *             if the XSRF verification fails.
     * @throws GwtKuraException
     *             if the Configuration Service cannot be located.
     * @throws GwtKuraException
     *             if the component configuration for the specified component cannot be found.
     */
    public List<GwtConfigComponent> findFilteredComponentConfiguration(GwtXSRFToken xsrfToken, String pid)
            throws GwtKuraException;

    /**
     * This method returns the list of component configurations as extracted from the
     * {@link org.osgi.service.cm.ConfigurationAdmin}.
     * 
     * @param xsrfToken
     *            the cross site request forgery token.
     * @return a list of GwtConfigComponent.
     * @throws GwtKuraException
     *             if the XSRF verification fails.
     * @throws GwtKuraException
     *             if the Configuration Service cannot be located.
     * @throws GwtKuraException
     *             if the component configurations cannot be extracted.
     */
    public List<GwtConfigComponent> findComponentConfigurations(GwtXSRFToken xsrfToken) throws GwtKuraException;

    /**
     * This method returns a list containing the component configuration associated to the specified PID and tracked by
     * the {@link org.osgi.service.cm.ConfigurationAdmin}.
     * 
     * @param xsrfToken
     *            the cross site request forgery token.
     * @param pid
     *            the Kura persistent identifier, <i>kura.service.pid</i>.
     * @return a list of GwtConfigComponent.
     * @throws GwtKuraException
     *             if the XSRF verification fails.
     * @throws GwtKuraException
     *             if the Configuration Service cannot be located.
     * @throws GwtKuraException
     *             if the component configuration for the specified component cannot be found.
     */
    public List<GwtConfigComponent> findComponentConfiguration(GwtXSRFToken xsrfToken, String pid)
            throws GwtKuraException;

    /**
     * This method gets an updated component configuration in form of a {@link GwtConfigComponent} and applies those
     * changes using the {@link org.eclipse.kura.configuration.ConfigurationService}
     * 
     * @param xsrfToken
     *            the cross site request forgery token.
     * @param configComponent
     *            a GwtConfigComponent instance that contains the updated configuration.
     * @throws GwtKuraException
     *             if the XSRF verification fails.
     * @throws GwtKuraException
     *             if the Configuration Service cannot be located.
     * @throws GwtKuraException
     *             if the current component configuration cannot be extracted from the Configuration Service.
     * @throws GwtKuraException
     *             if the component configuration changes could not be applied.
     */
    public void updateComponentConfiguration(GwtXSRFToken xsrfToken, GwtConfigComponent configComponent)
            throws GwtKuraException;
}